Cuadro comparativo

library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages -------------------------------------------------------------------------- tidyverse 1.3.1 --
v ggplot2 3.3.3     v purrr   0.3.4
v tibble  3.1.1     v dplyr   1.0.5
v tidyr   1.1.3     v stringr 1.4.0
v readr   1.4.0     v forcats 0.5.1
-- Conflicts ----------------------------------------------------------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(readxl)
library(zoo)

Attaching package: 㤼㸱zoo㤼㸲

The following objects are masked from 㤼㸱package:base㤼㸲:

    as.Date, as.Date.numeric
library(ggplot2)
library(readxl)

comparacion_estimaciones_renta_hidrocarburifera <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/comparacion_estimaciones_renta_hidrocarburifera.xlsx") %>% 
  select(-fuente) %>% 
  spread(key = tipo_de_renta,
         value = criterio_calculo)  


# writexl::write_xlsx(comparacion_estimaciones_renta_hidrocarburifera,
#                     path = "cuadro_columnas.xlsx")

Renta

Ramon

renta_total_ramon <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Ramon.xlsx", 
    sheet = "Renta total", skip = 6) %>% 
  select(1:5) %>% 
  rename(anio = "...1",
         trimestre = "...2",
          renta_total = "(RD+RM)...3",
         renta_diferencial = "...4", 
         renta_monopolio = "...5") %>% 
  mutate(anio =  na.locf(anio),
         unidad = "Millones de USD") %>%
  select(anio, trimestre, unidad, everything(.)) %>% 
  filter(trimestre != "Total") 
New names:
* `` -> ...1
* `` -> ...2
* `(RD+RM)` -> `(RD+RM)...3`
* `` -> ...4
* `` -> ...5
* ...
         

renta_total_distribucion_ramon <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Ramon.xlsx", 
    sheet = 2, skip = 7) %>% 
   rename(anio = "...1",
         trimestre = "...2",
          renta_total = "...3",
         renta_empresas_directa = Directa,
         renta_empresas_con_subsidio = "c/Promoción",
         renta_apropiada_otros_total = "...6", 
         renta_estado_total = "...7",
         renta_estado_total_con_promocion = "(sin descontar promoción)",
         transferencias_del_estado = "...9",
         retenciones = "...10",
         regalias_nacion = "Nación",
         regalias_provincias = "Provincias",
         renta_sobrevaluacion = "...13",
         renta_refinadoras = "...14",
         renta_consumidores = "...15") %>% 
    mutate(anio =  na.locf(anio),
         unidad = "Millones de USD") %>% 
  select(anio, trimestre, unidad, everything(.))
New names:
* `` -> ...1
* `` -> ...2
* `` -> ...3
* `` -> ...6
* `` -> ...7
* ...
  
renta_total_distribucion_ramon

Barrera

renta_total_barrera <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Barrera.xlsx", 
    sheet = 2, skip = 1) %>% 
  select(-7) %>% 
  filter(!is.na(anio)) %>% 
  rename(produccion_petroleo_millones_bbl = "Extracción de petroleo" ,
         costo_local_usd_bbl = "Costo local del barril" ,
         precio_produccion_local_usd_bbl =  "Precio de producción por barril", 
         precio_wti_usd_bbl =  "Precio del barril WTI", 
         renta_total_millones_usd = "Renta petrolera" ) %>% 
  group_by(anio) %>% 
  mutate_all(as.double)
`mutate_all()` ignored the following grouping variables:
Column `anio`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
renta_total_barrera

Campodonico

renta_total_campodonico  <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Campodonico.xlsx", 
    sheet = 1, skip = 1) %>% 
  filter(anio != "unidad") %>%
  rename(produccion_millones_bbl = "Producción",
         precio_produccion_local_usd_bbl = "Precio_crudo_interno",
         precio_wti_usd_bbl  = "WTI", 
         costo_local_usd_bbl = "Costo_de_Producción_arg",
         renta_unitaria_usd_bbl = "Renta_Unitaria",
         renta_total_millones_usd = "Renta_Petrolera") %>% 
  mutate_all(as.double)

renta_distribucion_campodonico <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Campodonico.xlsx", 
    sheet = 3, skip = 1) %>% 
  rename(anio ="Años"   ,
         unidad = "Unidad",
         renta_total = "Total",
         renta_empresas = "Empresas Privadas",
         renta_estado_total =  "Estado",
         renta_consumidores = "Consumidor") %>% 
  mutate(unidad = "Millones de USD")

renta_estado_campodonico <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Campodonico.xlsx", 
    sheet = "Capturada_Estado") %>% 
  select(-Renta_captada_estado) %>% 
  rename(anio ="Años"   ,
         unidad = "Unidad",
         regalias = "Regalías",
         impuesto_ganancias = Impuesto_a_las_ganancias,
         retenciones = Retenciones) %>% 
  mutate( unidad = "Millones de USD",
          retenciones = as.double(retenciones))
NAs introducidos por coerci昼㸳n
         
         
renta_total_campodonico
renta_distribucion_campodonico

Mansilla

renta_total_mansilla  <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Mansilla.xlsx", 
    sheet = 1, skip = 1) %>% 
  rename(anio = Anio,
         produccion_millones_bbl = "Extraccion",
         precio_produccion_local_usd_bbl = "Precio de produccion",
         precio_internacional_usd_bbl  = "Precio internacional", 
         costo_local_usd_bbl = "Costo total",
         renta_unitaria_usd_bbl = "Renta petrolera",
         renta_total_millones_usd = "Renta petrolera total") %>% 
    filter(anio != "Unidad") %>% 
  mutate_all(as.double)

renta_diferencial_y_monopolica_mansilla <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Mansilla.xlsx", 
    sheet = 2, skip = 1) %>% 
  rename(anio = Anio,
         precio_produccion_arg = "precio de produccion argentina",
         precio_poduccion_marginal = "precio de produccion area marginal",
         renta_diferencial_argentina = "renta diferencial argentina",
         precio_wti = "precio wti",
         renta_absoluta_monopolio = "renta absoluta de monopolio",
         renta_diferencial_sobre_total = "porcentaje renta diferencial sobre renta total")

renta_distribucion_mansilla <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Mansilla.xlsx", 
    sheet = 3, skip = 1) %>% 
  rename(renta_total = "Renta petrolera total",
         renta_empresas = "Empresas",
         renta_estado_nacional =  "Estado Nacional",
         renta_estado_provincial =  "Estados provinciales",
         renta_consumidores = "Refinadores/consumidores")

renta_total_mansilla 
renta_diferencial_y_monopolica_mansilla
# renta_distribucion_mansilla

Scheimberg

renta_total_scheimberg  <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Scheimberg.xlsx", 
    sheet = 1, skip = 3) %>% 
  rename(variable = "...1") %>% 
  gather(key = anio,
         value = valor,
         2:4) %>% 
    filter(!is.na(valor)) %>% 
  spread(key = variable,
         value = valor) %>% 
  rename(venta_gas_millon_m3 = "Gas (millon m3)",
         ingreso_gas_millones_usd = "Gas (millón us$)",
         precio_medio_gas_usd_m3 = "Gas (us$/Mm3)",
         ingresos_petroleros_totales_millones_usd = "Ingresos Petroleros",
         venta_petroleo_miles_m3 = "Petróleo (mil m3)",
         ingreso_petroleo_millones_usd = "Petróleo (millón us$)",
         precio_medio_petroleo_usd_m3 = "Petróleo (us$/m3)",
         costo_boe_usd = "Costo por BOE (en US$)" ,
         costos_de_produccion_totales_millones_usd = "Petróleo + Gas (millón us$)",
         precio_internacional_usd_bbl = "Precio Internacional (US$/bl)",
         renta_petrolera_total_millones_usd = "Renta Petrolera") %>% 
   mutate_all(as.double)
New names:
* `` -> ...1
renta_distribucion_scheimberg <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Scheimberg.xlsx", 
    sheet = 2, skip = 3) %>% 
   rename(variable = "En millones de USD") %>% 
  gather(key = anio,
         value = valor,
         2:4) %>% 
    filter(!is.na(valor),
           variable != "En %") %>% 
   spread(key = variable,
         value = valor) %>% 
  rename(impuesto_ganancias = "Impuesto a las Ganancias",
         ingresos_brutos_sellos = "Ingresos Brutos + Sellos",
         regalias = "Regalías",
         retenciones = "Retención exportación",
         subsidio_consumo_gas = "Subsidio consumo gas",
         subsidio_consumo_petroleo = "Subsidio consumo petróleo",
         subsidio_consumo_total = "Total subsidio consumo",
         corporate_take_total = "Total Corporate take",
         goverment_take_total = "Total Government take" ) %>% 
  mutate_all(as.double) %>% 
  mutate(unidad = "Millones de USD") %>% 
  select(anio, unidad, everything(.))
  
  

tg_empresas_scheimberg <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/Autores/Scheimberg.xlsx", 
    sheet = 3, skip = 6) %>% 
  rename(empresa = "...1") %>% 
  gather(key = anio,
         value = valor,
         2:ncol(.)) %>% 
  filter(!is.na(valor)) %>% 
  group_by(empresa) %>% 
  mutate_all(as.double) %>% 
  rename(resultado_operativo_sobre_activo = valor)
New names:
* `` -> ...1
`mutate_all()` ignored the following grouping variables:
Column `empresa`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
NAs introducidos por coerci昼㸳nNAs introducidos por coerci昼㸳nNAs introducidos por coerci昼㸳nNAs introducidos por coerci昼㸳n
renta_total_scheimberg
renta_distribucion_scheimberg
tg_empresas_scheimberg
renta_total <- renta_total_ramon %>% 
  group_by(anio) %>% 
  summarise(ramon = sum(renta_total)) %>% 
  full_join(renta_total_barrera %>% 
              select(anio,barrera = renta_total_millones_usd )) %>%
  left_join(renta_total_campodonico %>%
              select(anio, campodonico = renta_total_millones_usd)) %>% 
  left_join(renta_total_mansilla %>% 
              select(anio,mansilla = renta_total_millones_usd )) %>% 
  left_join(renta_total_scheimberg %>% 
              select(anio,scheimberg = renta_petrolera_total_millones_usd )) %>% 
  mutate(unidad = "Millones de USD") %>% 
  arrange(anio)
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
renta_total

Comparación entre autores

renta_autores <- renta_total_distribucion_ramon %>% 
  rename(renta_empresas = renta_empresas_con_subsidio) %>% 
  mutate(regalias = regalias_nacion + regalias_provincias) %>% 
  select(-c(regalias_nacion , regalias_provincias))%>% 
  gather(key = tipo_de_renta,
         value = valor,
         4:ncol(.)) %>% 
  filter(!(tipo_de_renta %in% c("renta_empresas_directa", "renta_apropiada_otros_total",
                               # "renta_estado_total",
                               "renta_estado_total_con_promocion",  "transferencias_del_estado" ))) %>% 
  group_by(anio, unidad, tipo_de_renta) %>% 
  summarise(valor = sum(valor)) %>% 
  mutate(autor = "Ramon") %>% 
  full_join(renta_total_barrera %>% 
              select(anio, valor = renta_total_millones_usd ) %>% 
              mutate(autor = "Barrera",
                     tipo_de_renta = "renta_total"),
            by = c("anio", "tipo_de_renta", "valor", "autor")) %>%
  full_join(renta_distribucion_campodonico %>% 
              gather(key = tipo_de_renta,
                     value = valor,
                     3:ncol(.)) %>% 
              mutate(autor = "Campodonico")) %>% 
  full_join(renta_estado_campodonico %>% 
              gather(key = tipo_de_renta, 
                     value = valor, 
                     3:ncol(.)) %>% 
              mutate(autor = "Campodonico")) %>%
  full_join(renta_distribucion_mansilla %>% 
              mutate(renta_estado_total = renta_estado_provincial + renta_estado_nacional ) %>%
              select(-c(renta_estado_provincial, renta_estado_nacional)) %>%
              gather(key = tipo_de_renta,
                     value = valor,
                     3:ncol(.)) %>% 
              mutate(autor = "Mansilla"))  %>% 
  full_join(renta_distribucion_scheimberg %>% 
              left_join(renta_total_scheimberg %>% 
                          select(anio, renta_total = renta_petrolera_total_millones_usd)) %>% 
              rename(renta_estado_total = goverment_take_total,
                     renta_empresas = corporate_take_total) %>% 
              gather(key = tipo_de_renta,
                     value = valor,
                     3:ncol(.)) %>% 
              mutate(autor = "Scheimberg") %>% 
              filter(!(tipo_de_renta %in% c("subsidio_consumo_gas", "subsidio_consumo_petroleo")))) %>% 
  ungroup() %>% 
  mutate(unidad = "Millones de USD")
`summarise()` has grouped output by 'anio', 'unidad'. You can override using the `.groups` argument.
Joining, by = c("anio", "unidad", "tipo_de_renta", "valor", "autor")
Joining, by = c("anio", "unidad", "tipo_de_renta", "valor", "autor")
Joining, by = c("anio", "unidad", "tipo_de_renta", "valor", "autor")
Joining, by = "anio"
Joining, by = c("anio", "unidad", "tipo_de_renta", "valor", "autor")
  # anio = as.Date(paste0(anio, "-12-31"), format = "%Y-%m-%d"))
renta_autores

# write.csv(renta_autores, "renta_autores.csv")

graf_renta_total_autores <- renta_autores %>% 
  filter(tipo_de_renta%in% c("renta_total", "renta_estado_total")) %>% 
  ggplot(aes(anio, valor, color = autor))+
  geom_line()+
  geom_point()+
  facet_wrap(~tipo_de_renta)+
  labs(title = "Renta hidrocarburífera", 
       subtitle = "Comparación de estimaciones. Millones USD", 
       y = "Millones de USD")+
  theme_classic()+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

graf_tipos_renta <- renta_autores %>% 
  filter(!(tipo_de_renta%in% c("renta_total", "renta_estado_total"))) %>% 
  ggplot(aes(anio, valor, color = autor))+
  geom_line()+
  geom_point()+
  facet_wrap(~tipo_de_renta)+
  labs(title = "Renta hidrocarburífera", 
       subtitle = "Comparación de estimaciones. Millones USD", 
       y = "Millones de USD")+
  theme_classic()+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

plotly::ggplotly(graf_renta_total_autores)  
plotly::ggplotly(graf_tipos_renta)  

Costos

tcp_3500 <- read_csv("/Archivos/repos/hidrocarburos/analisis/resultados/auxiliares/tc_3500.csv") %>% 
  select(-X1)
Missing column names filled in: 'X1' [1]
-- Column specification -------------------------------------------------------------------------------------------
cols(
  X1 = col_double(),
  anio = col_double(),
  tcc_avg = col_double()
)
#costos propios
costos_ccnn <- read_xlsx("/Archivos/repos/hidrocarburos/analisis/resultados/argentina/costos_ccnn.xlsx") %>%
  select(anio, fuente, costo_boe = precio_costo, costo_mmbtu = precio_costo_mmbtu) %>% 
  filter(anio %in% (1990:2020) & fuente =="Empalme CCNN") %>% 
  mutate(autor = "Propia (Empalme CCNN)")


YPF_costos <- read_excel("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/YPF costos.xlsx") %>%
  select(anio = "Año", lifting_cost = "Costo \"lifting\" al cambio BNA" ,
         exp_cost = "Costos de Exploración/boe" ,des_cost= "Costos de Desarrollo/boe",
         trans_cost = "Costos de Transporte y otros/boe"  ) %>% 
  mutate(all_cost= lifting_cost +exp_cost +trans_cost + des_cost, 
         unidad= "USD/BOE", autor = "Propia (YPF)",
         anio = as.double(anio))
New names:
* Unidad -> Unidad...3
* Unidad -> Unidad...5
* Unidad -> Unidad...10
* Unidad -> Unidad...15
* Unidad -> Unidad...18
* ...
NAs introducidos por coerci昼㸳n
  
#     select(1,2,3)
#    rename(anio = "Año", tc = "Tasa de Cambio BNA",
#          costo_produccion_avg  =   "Costos de Producción Promedio", costo_lifting = 'Costo \"lifting\"', 
#          impuestos = "Costo por Impuestos locales y similares", otros_costos =   "Otros Costos") %>% 
# str(YPF_costos)
names(YPF_costos)
[1] "anio"         "lifting_cost" "exp_cost"     "des_cost"     "trans_cost"   "all_cost"     "unidad"      
[8] "autor"       
costos_ypf <-  read_csv("C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/YPF costos.xlsx - Hoja1.csv",
    col_types = cols(`Año` = col_double()),  locale = locale(decimal_mark = ",")) %>% 
  rename(anio = "Año", 
         costo_produccion_avg  =   "Costos de Producción Promedio", costo_lifting = 'Costo \"lifting\"', 
         impuestos = "Costo por Impuestos locales y similares", otros_costos =   "Otros Costos") %>% 
  select(anio, costo_produccion_avg, costo_lifting, impuestos, otros_costos) %>% 
  filter(!is.na(anio)) %>% 
  # mutate(costo = str_replace(costo, ",", ".")) %>% 
  # mutate_all(function(x) str_replace(x, ",", ".")) %>% 
  mutate_all(as.double) %>% 
  left_join(tcp_3500 %>% select(anio, tcc =tcc_avg)) %>%
  gather(key = variable, value = valor, 2:5  ) %>% 
  mutate( valor = valor/tcc, unidad= "USD/BOE", autor = "Propia (YPF)")
Duplicated column names deduplicated: 'Unidad' => 'Unidad_1' [8], 'Unidad' => 'Unidad_2' [11], 'Unidad' => 'Unidad_3' [15], 'Unidad' => 'Unidad_4' [19]1 parsing failure.
row col expected                                              actual                                                                                         file
 25 A昼㸱o a double Fuente: YPF, S.A. Financial Statements 2008 to 2020 'C:/Archivos/Datos/Hidrocarburos/Estimacion calculo renta otros/YPF costos.xlsx - Hoja1.csv'
Joining, by = "anio"
# mice::md.pattern(costos_ypf, rotate.names = T)
#bolivia EMI
costo_bolivia <- read_excel( "/Archivos/repos/hidrocarburos/analisis/data/bolivia/TG YPFB.xlsx", 
    sheet = "Costos II sin ponderación", skip = 4) %>%
  rename(anio = "...1", costo_boe = "u$s/BPE", costo_mmbtu = "u$d/MMBTU") %>% 
  select(anio, costo_boe, costo_mmbtu) %>%
  filter(!is.na(costo_boe)) %>% 
  mutate(autor = "Mussi (Bolivia)",
         anio = as.double(anio))
New names:
* `` -> ...1
* Total -> Total...4
* `` -> ...5
* Total -> Total...8
* `` -> ...9
* ...
# Costos en BOE o bbl
costos <- renta_total_scheimberg %>% 
  select(anio, costo = costo_boe_usd) %>% 
  mutate(autor = "Scheimberg") %>%
  rbind(renta_total_mansilla %>% 
          select(anio, costo = costo_local_usd_bbl) %>% 
          mutate( autor = "Mansilla")) %>%
  rbind(renta_total_campodonico %>% 
          select(anio, costo = costo_local_usd_bbl) %>% 
          mutate( autor = "Campodonico"))  %>% 
  rbind(renta_total_barrera %>% 
          select(anio, costo = costo_local_usd_bbl) %>% 
          mutate( autor = "Barrera")) %>% 
  rbind(costos_ccnn %>% select(costo= costo_boe, everything(.), -c(fuente, costo_mmbtu))) %>%
  # rbind(costos_ypf %>% filter(variable == "costo_produccion_avg") %>% select(anio, costo= valor, autor)) %>% 
  rbind(YPF_costos %>%  select(anio, costo= all_cost, autor)) %>% 
  # rbind(costo_bolivia %>% select(-costo_mmbtu)) %>%
  mutate(unidad = "USD/BOE")

#Costos en BOE
ggplot(costos, aes(anio, costo, color = autor))+
  geom_line()+
  geom_point()+
  labs(title= "Costos de producción hidrocarburífero en Argentina", subtitle = "Comparacion propia (CCNN e YPF) versus otros autores (balances)",
       caption = "Nota: Sólo Scheimberg y estimación propia presentan costos en BOE",
       y = "USD/barril", x ="Año")+
  scale_color_discrete(name= "Autor")+
  theme(legend.position = "bottom")#+

  # scale_y_continuous(breaks=seq(0,16,2))

#Costos en MMBTU
costos_ccnn %>% 
  select(-c(fuente, costo_boe)) %>% 
  mutate(autor = "Argentina (Propia)") %>% 
  rbind(costo_bolivia %>% select(-costo_boe)) %>% 
  ggplot( aes(anio, costo_mmbtu, color = autor))+
  geom_line()+
  geom_point()+
  labs(title= "Costos de producción hidrocarburífero en Argentina y Bolivia", 
       subtitle = "Comparacion propia (CCNN) versus EM (YPFB)",
       y = "USD/MMBTU", x ="Año")+
  scale_color_discrete(name= "País")+
  theme(legend.position = "bottom")#+


writexl::write_xlsx(costos, path = "/Archivos/repos/hidrocarburos/analisis/resultados/argentina/costos.xlsx")
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCkN1YWRybyBjb21wYXJhdGl2bw0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeSh6b28pDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHJlYWR4bCkNCg0KY29tcGFyYWNpb25fZXN0aW1hY2lvbmVzX3JlbnRhX2hpZHJvY2FyYnVyaWZlcmEgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIGNhbGN1bG8gcmVudGEgb3Ryb3MvY29tcGFyYWNpb25fZXN0aW1hY2lvbmVzX3JlbnRhX2hpZHJvY2FyYnVyaWZlcmEueGxzeCIpICU+JSANCiAgc2VsZWN0KC1mdWVudGUpICU+JSANCiAgc3ByZWFkKGtleSA9IHRpcG9fZGVfcmVudGEsDQogICAgICAgICB2YWx1ZSA9IGNyaXRlcmlvX2NhbGN1bG8pICANCg0KDQojIHdyaXRleGw6OndyaXRlX3hsc3goY29tcGFyYWNpb25fZXN0aW1hY2lvbmVzX3JlbnRhX2hpZHJvY2FyYnVyaWZlcmEsDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJjdWFkcm9fY29sdW1uYXMueGxzeCIpDQpgYGANCg0KIyBSZW50YQ0KDQojIyBSYW1vbg0KYGBge3J9DQpyZW50YV90b3RhbF9yYW1vbiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gY2FsY3VsbyByZW50YSBvdHJvcy9BdXRvcmVzL1JhbW9uLnhsc3giLCANCiAgICBzaGVldCA9ICJSZW50YSB0b3RhbCIsIHNraXAgPSA2KSAlPiUgDQogIHNlbGVjdCgxOjUpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiLi4uMSIsDQogICAgICAgICB0cmltZXN0cmUgPSAiLi4uMiIsDQogICAgICAgICAgcmVudGFfdG90YWwgPSAiKFJEK1JNKS4uLjMiLA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWwgPSAiLi4uNCIsIA0KICAgICAgICAgcmVudGFfbW9ub3BvbGlvID0gIi4uLjUiKSAlPiUgDQogIG11dGF0ZShhbmlvID0gIG5hLmxvY2YoYW5pbyksDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgVVNEIikgJT4lDQogIHNlbGVjdChhbmlvLCB0cmltZXN0cmUsIHVuaWRhZCwgZXZlcnl0aGluZyguKSkgJT4lIA0KICBmaWx0ZXIodHJpbWVzdHJlICE9ICJUb3RhbCIpIA0KICAgICAgICAgDQoNCnJlbnRhX3RvdGFsX2Rpc3RyaWJ1Y2lvbl9yYW1vbiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gY2FsY3VsbyByZW50YSBvdHJvcy9BdXRvcmVzL1JhbW9uLnhsc3giLCANCiAgICBzaGVldCA9IDIsIHNraXAgPSA3KSAlPiUgDQogICByZW5hbWUoYW5pbyA9ICIuLi4xIiwNCiAgICAgICAgIHRyaW1lc3RyZSA9ICIuLi4yIiwNCiAgICAgICAgICByZW50YV90b3RhbCA9ICIuLi4zIiwNCiAgICAgICAgIHJlbnRhX2VtcHJlc2FzX2RpcmVjdGEgPSBEaXJlY3RhLA0KICAgICAgICAgcmVudGFfZW1wcmVzYXNfY29uX3N1YnNpZGlvID0gImMvUHJvbW9jacOzbiIsDQogICAgICAgICByZW50YV9hcHJvcGlhZGFfb3Ryb3NfdG90YWwgPSAiLi4uNiIsIA0KICAgICAgICAgcmVudGFfZXN0YWRvX3RvdGFsID0gIi4uLjciLA0KICAgICAgICAgcmVudGFfZXN0YWRvX3RvdGFsX2Nvbl9wcm9tb2Npb24gPSAiKHNpbiBkZXNjb250YXIgcHJvbW9jacOzbikiLA0KICAgICAgICAgdHJhbnNmZXJlbmNpYXNfZGVsX2VzdGFkbyA9ICIuLi45IiwNCiAgICAgICAgIHJldGVuY2lvbmVzID0gIi4uLjEwIiwNCiAgICAgICAgIHJlZ2FsaWFzX25hY2lvbiA9ICJOYWNpw7NuIiwNCiAgICAgICAgIHJlZ2FsaWFzX3Byb3ZpbmNpYXMgPSAiUHJvdmluY2lhcyIsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbiA9ICIuLi4xMyIsDQogICAgICAgICByZW50YV9yZWZpbmFkb3JhcyA9ICIuLi4xNCIsDQogICAgICAgICByZW50YV9jb25zdW1pZG9yZXMgPSAiLi4uMTUiKSAlPiUgDQogICAgbXV0YXRlKGFuaW8gPSAgbmEubG9jZihhbmlvKSwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB0cmltZXN0cmUsIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCiAgDQpyZW50YV90b3RhbF9kaXN0cmlidWNpb25fcmFtb24NCmBgYA0KDQoNCg0KIyMgQmFycmVyYQ0KYGBge3J9DQpyZW50YV90b3RhbF9iYXJyZXJhIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBjYWxjdWxvIHJlbnRhIG90cm9zL0F1dG9yZXMvQmFycmVyYS54bHN4IiwgDQogICAgc2hlZXQgPSAyLCBza2lwID0gMSkgJT4lIA0KICBzZWxlY3QoLTcpICU+JSANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSkgJT4lIA0KICByZW5hbWUocHJvZHVjY2lvbl9wZXRyb2xlb19taWxsb25lc19iYmwgPSAiRXh0cmFjY2nDs24gZGUgcGV0cm9sZW8iICwNCiAgICAgICAgIGNvc3RvX2xvY2FsX3VzZF9iYmwgPSAiQ29zdG8gbG9jYWwgZGVsIGJhcnJpbCIgLA0KICAgICAgICAgcHJlY2lvX3Byb2R1Y2Npb25fbG9jYWxfdXNkX2JibCA9ICAiUHJlY2lvIGRlIHByb2R1Y2Npw7NuIHBvciBiYXJyaWwiLCANCiAgICAgICAgIHByZWNpb193dGlfdXNkX2JibCA9ICAiUHJlY2lvIGRlbCBiYXJyaWwgV1RJIiwgDQogICAgICAgICByZW50YV90b3RhbF9taWxsb25lc191c2QgPSAiUmVudGEgcGV0cm9sZXJhIiApICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCnJlbnRhX3RvdGFsX2JhcnJlcmENCmBgYA0KDQojIyBDYW1wb2Rvbmljbw0KYGBge3J9DQpyZW50YV90b3RhbF9jYW1wb2RvbmljbyAgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIGNhbGN1bG8gcmVudGEgb3Ryb3MvQXV0b3Jlcy9DYW1wb2Rvbmljby54bHN4IiwgDQogICAgc2hlZXQgPSAxLCBza2lwID0gMSkgJT4lIA0KICBmaWx0ZXIoYW5pbyAhPSAidW5pZGFkIikgJT4lDQogIHJlbmFtZShwcm9kdWNjaW9uX21pbGxvbmVzX2JibCA9ICJQcm9kdWNjacOzbiIsDQogICAgICAgICBwcmVjaW9fcHJvZHVjY2lvbl9sb2NhbF91c2RfYmJsID0gIlByZWNpb19jcnVkb19pbnRlcm5vIiwNCiAgICAgICAgIHByZWNpb193dGlfdXNkX2JibCAgPSAiV1RJIiwgDQogICAgICAgICBjb3N0b19sb2NhbF91c2RfYmJsID0gIkNvc3RvX2RlX1Byb2R1Y2Npw7NuX2FyZyIsDQogICAgICAgICByZW50YV91bml0YXJpYV91c2RfYmJsID0gIlJlbnRhX1VuaXRhcmlhIiwNCiAgICAgICAgIHJlbnRhX3RvdGFsX21pbGxvbmVzX3VzZCA9ICJSZW50YV9QZXRyb2xlcmEiKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpyZW50YV9kaXN0cmlidWNpb25fY2FtcG9kb25pY28gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIGNhbGN1bG8gcmVudGEgb3Ryb3MvQXV0b3Jlcy9DYW1wb2Rvbmljby54bHN4IiwgDQogICAgc2hlZXQgPSAzLCBza2lwID0gMSkgJT4lIA0KICByZW5hbWUoYW5pbyA9IkHDsW9zIiAgICwNCiAgICAgICAgIHVuaWRhZCA9ICJVbmlkYWQiLA0KICAgICAgICAgcmVudGFfdG90YWwgPSAiVG90YWwiLA0KICAgICAgICAgcmVudGFfZW1wcmVzYXMgPSAiRW1wcmVzYXMgUHJpdmFkYXMiLA0KICAgICAgICAgcmVudGFfZXN0YWRvX3RvdGFsID0gICJFc3RhZG8iLA0KICAgICAgICAgcmVudGFfY29uc3VtaWRvcmVzID0gIkNvbnN1bWlkb3IiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgVVNEIikNCg0KcmVudGFfZXN0YWRvX2NhbXBvZG9uaWNvIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBjYWxjdWxvIHJlbnRhIG90cm9zL0F1dG9yZXMvQ2FtcG9kb25pY28ueGxzeCIsIA0KICAgIHNoZWV0ID0gIkNhcHR1cmFkYV9Fc3RhZG8iKSAlPiUgDQogIHNlbGVjdCgtUmVudGFfY2FwdGFkYV9lc3RhZG8pICU+JSANCiAgcmVuYW1lKGFuaW8gPSJBw7FvcyIgICAsDQogICAgICAgICB1bmlkYWQgPSAiVW5pZGFkIiwNCiAgICAgICAgIHJlZ2FsaWFzID0gIlJlZ2Fsw61hcyIsDQogICAgICAgICBpbXB1ZXN0b19nYW5hbmNpYXMgPSBJbXB1ZXN0b19hX2xhc19nYW5hbmNpYXMsDQogICAgICAgICByZXRlbmNpb25lcyA9IFJldGVuY2lvbmVzKSAlPiUgDQogIG11dGF0ZSggdW5pZGFkID0gIk1pbGxvbmVzIGRlIFVTRCIsDQogICAgICAgICAgcmV0ZW5jaW9uZXMgPSBhcy5kb3VibGUocmV0ZW5jaW9uZXMpKQ0KICAgICAgICAgDQogICAgICAgICANCnJlbnRhX3RvdGFsX2NhbXBvZG9uaWNvDQpyZW50YV9kaXN0cmlidWNpb25fY2FtcG9kb25pY28NCmBgYA0KDQojIyBNYW5zaWxsYQ0KYGBge3J9DQpyZW50YV90b3RhbF9tYW5zaWxsYSAgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIGNhbGN1bG8gcmVudGEgb3Ryb3MvQXV0b3Jlcy9NYW5zaWxsYS54bHN4IiwgDQogICAgc2hlZXQgPSAxLCBza2lwID0gMSkgJT4lIA0KICByZW5hbWUoYW5pbyA9IEFuaW8sDQogICAgICAgICBwcm9kdWNjaW9uX21pbGxvbmVzX2JibCA9ICJFeHRyYWNjaW9uIiwNCiAgICAgICAgIHByZWNpb19wcm9kdWNjaW9uX2xvY2FsX3VzZF9iYmwgPSAiUHJlY2lvIGRlIHByb2R1Y2Npb24iLA0KICAgICAgICAgcHJlY2lvX2ludGVybmFjaW9uYWxfdXNkX2JibCAgPSAiUHJlY2lvIGludGVybmFjaW9uYWwiLCANCiAgICAgICAgIGNvc3RvX2xvY2FsX3VzZF9iYmwgPSAiQ29zdG8gdG90YWwiLA0KICAgICAgICAgcmVudGFfdW5pdGFyaWFfdXNkX2JibCA9ICJSZW50YSBwZXRyb2xlcmEiLA0KICAgICAgICAgcmVudGFfdG90YWxfbWlsbG9uZXNfdXNkID0gIlJlbnRhIHBldHJvbGVyYSB0b3RhbCIpICU+JSANCiAgICBmaWx0ZXIoYW5pbyAhPSAiVW5pZGFkIikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcmVudGFfZGlmZXJlbmNpYWxfeV9tb25vcG9saWNhX21hbnNpbGxhIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBjYWxjdWxvIHJlbnRhIG90cm9zL0F1dG9yZXMvTWFuc2lsbGEueGxzeCIsIA0KICAgIHNoZWV0ID0gMiwgc2tpcCA9IDEpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBBbmlvLA0KICAgICAgICAgcHJlY2lvX3Byb2R1Y2Npb25fYXJnID0gInByZWNpbyBkZSBwcm9kdWNjaW9uIGFyZ2VudGluYSIsDQogICAgICAgICBwcmVjaW9fcG9kdWNjaW9uX21hcmdpbmFsID0gInByZWNpbyBkZSBwcm9kdWNjaW9uIGFyZWEgbWFyZ2luYWwiLA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfYXJnZW50aW5hID0gInJlbnRhIGRpZmVyZW5jaWFsIGFyZ2VudGluYSIsDQogICAgICAgICBwcmVjaW9fd3RpID0gInByZWNpbyB3dGkiLA0KICAgICAgICAgcmVudGFfYWJzb2x1dGFfbW9ub3BvbGlvID0gInJlbnRhIGFic29sdXRhIGRlIG1vbm9wb2xpbyIsDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9zb2JyZV90b3RhbCA9ICJwb3JjZW50YWplIHJlbnRhIGRpZmVyZW5jaWFsIHNvYnJlIHJlbnRhIHRvdGFsIikNCg0KcmVudGFfZGlzdHJpYnVjaW9uX21hbnNpbGxhIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBjYWxjdWxvIHJlbnRhIG90cm9zL0F1dG9yZXMvTWFuc2lsbGEueGxzeCIsIA0KICAgIHNoZWV0ID0gMywgc2tpcCA9IDEpICU+JSANCiAgcmVuYW1lKHJlbnRhX3RvdGFsID0gIlJlbnRhIHBldHJvbGVyYSB0b3RhbCIsDQogICAgICAgICByZW50YV9lbXByZXNhcyA9ICJFbXByZXNhcyIsDQogICAgICAgICByZW50YV9lc3RhZG9fbmFjaW9uYWwgPSAgIkVzdGFkbyBOYWNpb25hbCIsDQogICAgICAgICByZW50YV9lc3RhZG9fcHJvdmluY2lhbCA9ICAiRXN0YWRvcyBwcm92aW5jaWFsZXMiLA0KICAgICAgICAgcmVudGFfY29uc3VtaWRvcmVzID0gIlJlZmluYWRvcmVzL2NvbnN1bWlkb3JlcyIpDQoNCnJlbnRhX3RvdGFsX21hbnNpbGxhIA0KcmVudGFfZGlmZXJlbmNpYWxfeV9tb25vcG9saWNhX21hbnNpbGxhDQojIHJlbnRhX2Rpc3RyaWJ1Y2lvbl9tYW5zaWxsYQ0KYGBgDQoNCiMjIFNjaGVpbWJlcmcNCmBgYHtyfQ0KcmVudGFfdG90YWxfc2NoZWltYmVyZyAgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIGNhbGN1bG8gcmVudGEgb3Ryb3MvQXV0b3Jlcy9TY2hlaW1iZXJnLnhsc3giLCANCiAgICBzaGVldCA9IDEsIHNraXAgPSAzKSAlPiUgDQogIHJlbmFtZSh2YXJpYWJsZSA9ICIuLi4xIikgJT4lIA0KICBnYXRoZXIoa2V5ID0gYW5pbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAyOjQpICU+JSANCiAgICBmaWx0ZXIoIWlzLm5hKHZhbG9yKSkgJT4lIA0KICBzcHJlYWQoa2V5ID0gdmFyaWFibGUsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yKSAlPiUgDQogIHJlbmFtZSh2ZW50YV9nYXNfbWlsbG9uX20zID0gIkdhcyAobWlsbG9uIG0zKSIsDQogICAgICAgICBpbmdyZXNvX2dhc19taWxsb25lc191c2QgPSAiR2FzIChtaWxsw7NuIHVzJCkiLA0KICAgICAgICAgcHJlY2lvX21lZGlvX2dhc191c2RfbTMgPSAiR2FzICh1cyQvTW0zKSIsDQogICAgICAgICBpbmdyZXNvc19wZXRyb2xlcm9zX3RvdGFsZXNfbWlsbG9uZXNfdXNkID0gIkluZ3Jlc29zIFBldHJvbGVyb3MiLA0KICAgICAgICAgdmVudGFfcGV0cm9sZW9fbWlsZXNfbTMgPSAiUGV0csOzbGVvIChtaWwgbTMpIiwNCiAgICAgICAgIGluZ3Jlc29fcGV0cm9sZW9fbWlsbG9uZXNfdXNkID0gIlBldHLDs2xlbyAobWlsbMOzbiB1cyQpIiwNCiAgICAgICAgIHByZWNpb19tZWRpb19wZXRyb2xlb191c2RfbTMgPSAiUGV0csOzbGVvICh1cyQvbTMpIiwNCiAgICAgICAgIGNvc3RvX2JvZV91c2QgPSAiQ29zdG8gcG9yIEJPRSAoZW4gVVMkKSIgLA0KICAgICAgICAgY29zdG9zX2RlX3Byb2R1Y2Npb25fdG90YWxlc19taWxsb25lc191c2QgPSAiUGV0csOzbGVvICsgR2FzIChtaWxsw7NuIHVzJCkiLA0KICAgICAgICAgcHJlY2lvX2ludGVybmFjaW9uYWxfdXNkX2JibCA9ICJQcmVjaW8gSW50ZXJuYWNpb25hbCAoVVMkL2JsKSIsDQogICAgICAgICByZW50YV9wZXRyb2xlcmFfdG90YWxfbWlsbG9uZXNfdXNkID0gIlJlbnRhIFBldHJvbGVyYSIpICU+JSANCiAgIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpyZW50YV9kaXN0cmlidWNpb25fc2NoZWltYmVyZyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gY2FsY3VsbyByZW50YSBvdHJvcy9BdXRvcmVzL1NjaGVpbWJlcmcueGxzeCIsIA0KICAgIHNoZWV0ID0gMiwgc2tpcCA9IDMpICU+JSANCiAgIHJlbmFtZSh2YXJpYWJsZSA9ICJFbiBtaWxsb25lcyBkZSBVU0QiKSAlPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6NCkgJT4lIA0KICAgIGZpbHRlcighaXMubmEodmFsb3IpLA0KICAgICAgICAgICB2YXJpYWJsZSAhPSAiRW4gJSIpICU+JSANCiAgIHNwcmVhZChrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IpICU+JSANCiAgcmVuYW1lKGltcHVlc3RvX2dhbmFuY2lhcyA9ICJJbXB1ZXN0byBhIGxhcyBHYW5hbmNpYXMiLA0KICAgICAgICAgaW5ncmVzb3NfYnJ1dG9zX3NlbGxvcyA9ICJJbmdyZXNvcyBCcnV0b3MgKyBTZWxsb3MiLA0KICAgICAgICAgcmVnYWxpYXMgPSAiUmVnYWzDrWFzIiwNCiAgICAgICAgIHJldGVuY2lvbmVzID0gIlJldGVuY2nDs24gZXhwb3J0YWNpw7NuIiwNCiAgICAgICAgIHN1YnNpZGlvX2NvbnN1bW9fZ2FzID0gIlN1YnNpZGlvIGNvbnN1bW8gZ2FzIiwNCiAgICAgICAgIHN1YnNpZGlvX2NvbnN1bW9fcGV0cm9sZW8gPSAiU3Vic2lkaW8gY29uc3VtbyBwZXRyw7NsZW8iLA0KICAgICAgICAgc3Vic2lkaW9fY29uc3Vtb190b3RhbCA9ICJUb3RhbCBzdWJzaWRpbyBjb25zdW1vIiwNCiAgICAgICAgIGNvcnBvcmF0ZV90YWtlX3RvdGFsID0gIlRvdGFsIENvcnBvcmF0ZSB0YWtlIiwNCiAgICAgICAgIGdvdmVybWVudF90YWtlX3RvdGFsID0gIlRvdGFsIEdvdmVybm1lbnQgdGFrZSIgKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsbG9uZXMgZGUgVVNEIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKQ0KICANCiAgDQoNCnRnX2VtcHJlc2FzX3NjaGVpbWJlcmcgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIGNhbGN1bG8gcmVudGEgb3Ryb3MvQXV0b3Jlcy9TY2hlaW1iZXJnLnhsc3giLCANCiAgICBzaGVldCA9IDMsIHNraXAgPSA2KSAlPiUgDQogIHJlbmFtZShlbXByZXNhID0gIi4uLjEiKSAlPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHZhbG9yKSkgJT4lIA0KICBncm91cF9ieShlbXByZXNhKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIHJlbmFtZShyZXN1bHRhZG9fb3BlcmF0aXZvX3NvYnJlX2FjdGl2byA9IHZhbG9yKQ0KDQpyZW50YV90b3RhbF9zY2hlaW1iZXJnDQpyZW50YV9kaXN0cmlidWNpb25fc2NoZWltYmVyZw0KdGdfZW1wcmVzYXNfc2NoZWltYmVyZw0KYGBgDQoNCmBgYHtyfQ0KcmVudGFfdG90YWwgPC0gcmVudGFfdG90YWxfcmFtb24gJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShyYW1vbiA9IHN1bShyZW50YV90b3RhbCkpICU+JSANCiAgZnVsbF9qb2luKHJlbnRhX3RvdGFsX2JhcnJlcmEgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbyxiYXJyZXJhID0gcmVudGFfdG90YWxfbWlsbG9uZXNfdXNkICkpICU+JQ0KICBsZWZ0X2pvaW4ocmVudGFfdG90YWxfY2FtcG9kb25pY28gJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBjYW1wb2RvbmljbyA9IHJlbnRhX3RvdGFsX21pbGxvbmVzX3VzZCkpICU+JSANCiAgbGVmdF9qb2luKHJlbnRhX3RvdGFsX21hbnNpbGxhICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sbWFuc2lsbGEgPSByZW50YV90b3RhbF9taWxsb25lc191c2QgKSkgJT4lIA0KICBsZWZ0X2pvaW4ocmVudGFfdG90YWxfc2NoZWltYmVyZyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLHNjaGVpbWJlcmcgPSByZW50YV9wZXRyb2xlcmFfdG90YWxfbWlsbG9uZXNfdXNkICkpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiKSAlPiUgDQogIGFycmFuZ2UoYW5pbykNCg0KcmVudGFfdG90YWwNCmBgYA0KDQoNCiMjIENvbXBhcmFjacOzbiBlbnRyZSBhdXRvcmVzDQpgYGB7cn0NCnJlbnRhX2F1dG9yZXMgPC0gcmVudGFfdG90YWxfZGlzdHJpYnVjaW9uX3JhbW9uICU+JSANCiAgcmVuYW1lKHJlbnRhX2VtcHJlc2FzID0gcmVudGFfZW1wcmVzYXNfY29uX3N1YnNpZGlvKSAlPiUgDQogIG11dGF0ZShyZWdhbGlhcyA9IHJlZ2FsaWFzX25hY2lvbiArIHJlZ2FsaWFzX3Byb3ZpbmNpYXMpICU+JSANCiAgc2VsZWN0KC1jKHJlZ2FsaWFzX25hY2lvbiAsIHJlZ2FsaWFzX3Byb3ZpbmNpYXMpKSU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fZGVfcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgNDpuY29sKC4pKSAlPiUgDQogIGZpbHRlcighKHRpcG9fZGVfcmVudGEgJWluJSBjKCJyZW50YV9lbXByZXNhc19kaXJlY3RhIiwgInJlbnRhX2Fwcm9waWFkYV9vdHJvc190b3RhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAicmVudGFfZXN0YWRvX3RvdGFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVudGFfZXN0YWRvX3RvdGFsX2Nvbl9wcm9tb2Npb24iLCAgInRyYW5zZmVyZW5jaWFzX2RlbF9lc3RhZG8iICkpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCwgdGlwb19kZV9yZW50YSkgJT4lIA0KICBzdW1tYXJpc2UodmFsb3IgPSBzdW0odmFsb3IpKSAlPiUgDQogIG11dGF0ZShhdXRvciA9ICJSYW1vbiIpICU+JSANCiAgZnVsbF9qb2luKHJlbnRhX3RvdGFsX2JhcnJlcmEgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdmFsb3IgPSByZW50YV90b3RhbF9taWxsb25lc191c2QgKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShhdXRvciA9ICJCYXJyZXJhIiwNCiAgICAgICAgICAgICAgICAgICAgIHRpcG9fZGVfcmVudGEgPSAicmVudGFfdG90YWwiKSwNCiAgICAgICAgICAgIGJ5ID0gYygiYW5pbyIsICJ0aXBvX2RlX3JlbnRhIiwgInZhbG9yIiwgImF1dG9yIikpICU+JQ0KICBmdWxsX2pvaW4ocmVudGFfZGlzdHJpYnVjaW9uX2NhbXBvZG9uaWNvICU+JSANCiAgICAgICAgICAgICAgZ2F0aGVyKGtleSA9IHRpcG9fZGVfcmVudGEsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgICAgICAgICAgICAgMzpuY29sKC4pKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShhdXRvciA9ICJDYW1wb2RvbmljbyIpKSAlPiUgDQogIGZ1bGxfam9pbihyZW50YV9lc3RhZG9fY2FtcG9kb25pY28gJT4lIA0KICAgICAgICAgICAgICBnYXRoZXIoa2V5ID0gdGlwb19kZV9yZW50YSwgDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLCANCiAgICAgICAgICAgICAgICAgICAgIDM6bmNvbCguKSkgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoYXV0b3IgPSAiQ2FtcG9kb25pY28iKSkgJT4lDQogIGZ1bGxfam9pbihyZW50YV9kaXN0cmlidWNpb25fbWFuc2lsbGEgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUocmVudGFfZXN0YWRvX3RvdGFsID0gcmVudGFfZXN0YWRvX3Byb3ZpbmNpYWwgKyByZW50YV9lc3RhZG9fbmFjaW9uYWwgKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KC1jKHJlbnRhX2VzdGFkb19wcm92aW5jaWFsLCByZW50YV9lc3RhZG9fbmFjaW9uYWwpKSAlPiUNCiAgICAgICAgICAgICAgZ2F0aGVyKGtleSA9IHRpcG9fZGVfcmVudGEsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgICAgICAgICAgICAgMzpuY29sKC4pKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShhdXRvciA9ICJNYW5zaWxsYSIpKSAgJT4lIA0KICBmdWxsX2pvaW4ocmVudGFfZGlzdHJpYnVjaW9uX3NjaGVpbWJlcmcgJT4lIA0KICAgICAgICAgICAgICBsZWZ0X2pvaW4ocmVudGFfdG90YWxfc2NoZWltYmVyZyAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCByZW50YV90b3RhbCA9IHJlbnRhX3BldHJvbGVyYV90b3RhbF9taWxsb25lc191c2QpKSAlPiUgDQogICAgICAgICAgICAgIHJlbmFtZShyZW50YV9lc3RhZG9fdG90YWwgPSBnb3Zlcm1lbnRfdGFrZV90b3RhbCwNCiAgICAgICAgICAgICAgICAgICAgIHJlbnRhX2VtcHJlc2FzID0gY29ycG9yYXRlX3Rha2VfdG90YWwpICU+JSANCiAgICAgICAgICAgICAgZ2F0aGVyKGtleSA9IHRpcG9fZGVfcmVudGEsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgICAgICAgICAgICAgMzpuY29sKC4pKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShhdXRvciA9ICJTY2hlaW1iZXJnIikgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoISh0aXBvX2RlX3JlbnRhICVpbiUgYygic3Vic2lkaW9fY29uc3Vtb19nYXMiLCAic3Vic2lkaW9fY29uc3Vtb19wZXRyb2xlbyIpKSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiKQ0KICAjIGFuaW8gPSBhcy5EYXRlKHBhc3RlMChhbmlvLCAiLTEyLTMxIiksIGZvcm1hdCA9ICIlWS0lbS0lZCIpKQ0KcmVudGFfYXV0b3Jlcw0KDQojIHdyaXRlLmNzdihyZW50YV9hdXRvcmVzLCAicmVudGFfYXV0b3Jlcy5jc3YiKQ0KYGBgDQoNCg0KYGBge3J9DQoNCmdyYWZfcmVudGFfdG90YWxfYXV0b3JlcyA8LSByZW50YV9hdXRvcmVzICU+JSANCiAgZmlsdGVyKHRpcG9fZGVfcmVudGElaW4lIGMoInJlbnRhX3RvdGFsIiwgInJlbnRhX2VzdGFkb190b3RhbCIpKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gYXV0b3IpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgZmFjZXRfd3JhcCh+dGlwb19kZV9yZW50YSkrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJDb21wYXJhY2nDs24gZGUgZXN0aW1hY2lvbmVzLiBNaWxsb25lcyBVU0QiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQoNCmdyYWZfdGlwb3NfcmVudGEgPC0gcmVudGFfYXV0b3JlcyAlPiUgDQogIGZpbHRlcighKHRpcG9fZGVfcmVudGElaW4lIGMoInJlbnRhX3RvdGFsIiwgInJlbnRhX2VzdGFkb190b3RhbCIpKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGF1dG9yKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGZhY2V0X3dyYXAofnRpcG9fZGVfcmVudGEpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIGVzdGltYWNpb25lcy4gTWlsbG9uZXMgVVNEIiwgDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KDQpwbG90bHk6OmdncGxvdGx5KGdyYWZfcmVudGFfdG90YWxfYXV0b3JlcykgIA0KcGxvdGx5OjpnZ3Bsb3RseShncmFmX3RpcG9zX3JlbnRhKSAgDQpgYGANCiMgQ29zdG9zDQoNCmBgYHtyfQ0KdGNwXzM1MDAgPC0gcmVhZF9jc3YoIi9BcmNoaXZvcy9yZXBvcy9oaWRyb2NhcmJ1cm9zL2FuYWxpc2lzL3Jlc3VsdGFkb3MvYXV4aWxpYXJlcy90Y18zNTAwLmNzdiIpICU+JSANCiAgc2VsZWN0KC1YMSkNCg0KI2Nvc3RvcyBwcm9waW9zDQpjb3N0b3NfY2NubiA8LSByZWFkX3hsc3goIi9BcmNoaXZvcy9yZXBvcy9oaWRyb2NhcmJ1cm9zL2FuYWxpc2lzL3Jlc3VsdGFkb3MvYXJnZW50aW5hL2Nvc3Rvc19jY25uLnhsc3giKSAlPiUNCiAgc2VsZWN0KGFuaW8sIGZ1ZW50ZSwgY29zdG9fYm9lID0gcHJlY2lvX2Nvc3RvLCBjb3N0b19tbWJ0dSA9IHByZWNpb19jb3N0b19tbWJ0dSkgJT4lIA0KICBmaWx0ZXIoYW5pbyAlaW4lICgxOTkwOjIwMjApICYgZnVlbnRlID09IkVtcGFsbWUgQ0NOTiIpICU+JSANCiAgbXV0YXRlKGF1dG9yID0gIlByb3BpYSAoRW1wYWxtZSBDQ05OKSIpDQoNCg0KWVBGX2Nvc3RvcyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gY2FsY3VsbyByZW50YSBvdHJvcy9ZUEYgY29zdG9zLnhsc3giKSAlPiUNCiAgc2VsZWN0KGFuaW8gPSAiQcOxbyIsIGxpZnRpbmdfY29zdCA9ICJDb3N0byBcImxpZnRpbmdcIiBhbCBjYW1iaW8gQk5BIiAsDQogICAgICAgICBleHBfY29zdCA9ICJDb3N0b3MgZGUgRXhwbG9yYWNpw7NuL2JvZSIgLGRlc19jb3N0PSAiQ29zdG9zIGRlIERlc2Fycm9sbG8vYm9lIiwNCiAgICAgICAgIHRyYW5zX2Nvc3QgPSAiQ29zdG9zIGRlIFRyYW5zcG9ydGUgeSBvdHJvcy9ib2UiICApICU+JSANCiAgbXV0YXRlKGFsbF9jb3N0PSBsaWZ0aW5nX2Nvc3QgK2V4cF9jb3N0ICt0cmFuc19jb3N0ICsgZGVzX2Nvc3QsIA0KICAgICAgICAgdW5pZGFkPSAiVVNEL0JPRSIsIGF1dG9yID0gIlByb3BpYSAoWVBGKSIsDQogICAgICAgICBhbmlvID0gYXMuZG91YmxlKGFuaW8pKQ0KDQogIA0KIyAgICAgc2VsZWN0KDEsMiwzKQ0KIyAgICByZW5hbWUoYW5pbyA9ICJBw7FvIiwgdGMgPSAiVGFzYSBkZSBDYW1iaW8gQk5BIiwNCiMgICAgICAgICAgY29zdG9fcHJvZHVjY2lvbl9hdmcgID0gICAiQ29zdG9zIGRlIFByb2R1Y2Npw7NuIFByb21lZGlvIiwgY29zdG9fbGlmdGluZyA9ICdDb3N0byBcImxpZnRpbmdcIicsIA0KIyAgICAgICAgICBpbXB1ZXN0b3MgPSAiQ29zdG8gcG9yIEltcHVlc3RvcyBsb2NhbGVzIHkgc2ltaWxhcmVzIiwgb3Ryb3NfY29zdG9zID0gICAiT3Ryb3MgQ29zdG9zIikgJT4lIA0KIyBzdHIoWVBGX2Nvc3RvcykNCm5hbWVzKFlQRl9jb3N0b3MpDQpgYGANCg0KDQpgYGB7cn0NCmNvc3Rvc195cGYgPC0gIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gY2FsY3VsbyByZW50YSBvdHJvcy9ZUEYgY29zdG9zLnhsc3ggLSBIb2phMS5jc3YiLA0KICAgIGNvbF90eXBlcyA9IGNvbHMoYEHDsW9gID0gY29sX2RvdWJsZSgpKSwgIGxvY2FsZSA9IGxvY2FsZShkZWNpbWFsX21hcmsgPSAiLCIpKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDsW8iLCANCiAgICAgICAgIGNvc3RvX3Byb2R1Y2Npb25fYXZnICA9ICAgIkNvc3RvcyBkZSBQcm9kdWNjacOzbiBQcm9tZWRpbyIsIGNvc3RvX2xpZnRpbmcgPSAnQ29zdG8gXCJsaWZ0aW5nXCInLCANCiAgICAgICAgIGltcHVlc3RvcyA9ICJDb3N0byBwb3IgSW1wdWVzdG9zIGxvY2FsZXMgeSBzaW1pbGFyZXMiLCBvdHJvc19jb3N0b3MgPSAgICJPdHJvcyBDb3N0b3MiKSAlPiUgDQogIHNlbGVjdChhbmlvLCBjb3N0b19wcm9kdWNjaW9uX2F2ZywgY29zdG9fbGlmdGluZywgaW1wdWVzdG9zLCBvdHJvc19jb3N0b3MpICU+JSANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSkgJT4lIA0KICAjIG11dGF0ZShjb3N0byA9IHN0cl9yZXBsYWNlKGNvc3RvLCAiLCIsICIuIikpICU+JSANCiAgIyBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHN0cl9yZXBsYWNlKHgsICIsIiwgIi4iKSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICBsZWZ0X2pvaW4odGNwXzM1MDAgJT4lIHNlbGVjdChhbmlvLCB0Y2MgPXRjY19hdmcpKSAlPiUNCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLCB2YWx1ZSA9IHZhbG9yLCAyOjUgICkgJT4lIA0KICBtdXRhdGUoIHZhbG9yID0gdmFsb3IvdGNjLCB1bmlkYWQ9ICJVU0QvQk9FIiwgYXV0b3IgPSAiUHJvcGlhIChZUEYpIikNCg0KIyBtaWNlOjptZC5wYXR0ZXJuKGNvc3Rvc195cGYsIHJvdGF0ZS5uYW1lcyA9IFQpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KI2JvbGl2aWEgRU1JDQpjb3N0b19ib2xpdmlhIDwtIHJlYWRfZXhjZWwoICIvQXJjaGl2b3MvcmVwb3MvaGlkcm9jYXJidXJvcy9hbmFsaXNpcy9kYXRhL2JvbGl2aWEvVEcgWVBGQi54bHN4IiwgDQogICAgc2hlZXQgPSAiQ29zdG9zIElJIHNpbiBwb25kZXJhY2nDs24iLCBza2lwID0gNCkgJT4lDQogIHJlbmFtZShhbmlvID0gIi4uLjEiLCBjb3N0b19ib2UgPSAidSRzL0JQRSIsIGNvc3RvX21tYnR1ID0gInUkZC9NTUJUVSIpICU+JSANCiAgc2VsZWN0KGFuaW8sIGNvc3RvX2JvZSwgY29zdG9fbW1idHUpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGNvc3RvX2JvZSkpICU+JSANCiAgbXV0YXRlKGF1dG9yID0gIk11c3NpIChCb2xpdmlhKSIsDQogICAgICAgICBhbmlvID0gYXMuZG91YmxlKGFuaW8pKQ0KDQojIENvc3RvcyBlbiBCT0UgbyBiYmwNCmNvc3RvcyA8LSByZW50YV90b3RhbF9zY2hlaW1iZXJnICU+JSANCiAgc2VsZWN0KGFuaW8sIGNvc3RvID0gY29zdG9fYm9lX3VzZCkgJT4lIA0KICBtdXRhdGUoYXV0b3IgPSAiU2NoZWltYmVyZyIpICU+JQ0KICByYmluZChyZW50YV90b3RhbF9tYW5zaWxsYSAlPiUgDQogICAgICAgICAgc2VsZWN0KGFuaW8sIGNvc3RvID0gY29zdG9fbG9jYWxfdXNkX2JibCkgJT4lIA0KICAgICAgICAgIG11dGF0ZSggYXV0b3IgPSAiTWFuc2lsbGEiKSkgJT4lDQogIHJiaW5kKHJlbnRhX3RvdGFsX2NhbXBvZG9uaWNvICU+JSANCiAgICAgICAgICBzZWxlY3QoYW5pbywgY29zdG8gPSBjb3N0b19sb2NhbF91c2RfYmJsKSAlPiUgDQogICAgICAgICAgbXV0YXRlKCBhdXRvciA9ICJDYW1wb2RvbmljbyIpKSAgJT4lIA0KICByYmluZChyZW50YV90b3RhbF9iYXJyZXJhICU+JSANCiAgICAgICAgICBzZWxlY3QoYW5pbywgY29zdG8gPSBjb3N0b19sb2NhbF91c2RfYmJsKSAlPiUgDQogICAgICAgICAgbXV0YXRlKCBhdXRvciA9ICJCYXJyZXJhIikpICU+JSANCiAgcmJpbmQoY29zdG9zX2Njbm4gJT4lIHNlbGVjdChjb3N0bz0gY29zdG9fYm9lLCBldmVyeXRoaW5nKC4pLCAtYyhmdWVudGUsIGNvc3RvX21tYnR1KSkpICU+JQ0KICAjIHJiaW5kKGNvc3Rvc195cGYgJT4lIGZpbHRlcih2YXJpYWJsZSA9PSAiY29zdG9fcHJvZHVjY2lvbl9hdmciKSAlPiUgc2VsZWN0KGFuaW8sIGNvc3RvPSB2YWxvciwgYXV0b3IpKSAlPiUgDQogIHJiaW5kKFlQRl9jb3N0b3MgJT4lICBzZWxlY3QoYW5pbywgY29zdG89IGFsbF9jb3N0LCBhdXRvcikpICU+JSANCiAgIyByYmluZChjb3N0b19ib2xpdmlhICU+JSBzZWxlY3QoLWNvc3RvX21tYnR1KSkgJT4lDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL0JPRSIpDQoNCiNDb3N0b3MgZW4gQk9FDQpnZ3Bsb3QoY29zdG9zLCBhZXMoYW5pbywgY29zdG8sIGNvbG9yID0gYXV0b3IpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZT0gIkNvc3RvcyBkZSBwcm9kdWNjacOzbiBoaWRyb2NhcmJ1csOtZmVybyBlbiBBcmdlbnRpbmEiLCBzdWJ0aXRsZSA9ICJDb21wYXJhY2lvbiBwcm9waWEgKENDTk4gZSBZUEYpIHZlcnN1cyBvdHJvcyBhdXRvcmVzIChiYWxhbmNlcykiLA0KICAgICAgIGNhcHRpb24gPSAiTm90YTogU8OzbG8gU2NoZWltYmVyZyB5IGVzdGltYWNpw7NuIHByb3BpYSBwcmVzZW50YW4gY29zdG9zIGVuIEJPRSIsDQogICAgICAgeSA9ICJVU0QvYmFycmlsIiwgeCA9IkHDsW8iKSsNCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobmFtZT0gIkF1dG9yIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSMrDQogICMgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwxNiwyKSkNCg0KI0Nvc3RvcyBlbiBNTUJUVQ0KY29zdG9zX2Njbm4gJT4lIA0KICBzZWxlY3QoLWMoZnVlbnRlLCBjb3N0b19ib2UpKSAlPiUgDQogIG11dGF0ZShhdXRvciA9ICJBcmdlbnRpbmEgKFByb3BpYSkiKSAlPiUgDQogIHJiaW5kKGNvc3RvX2JvbGl2aWEgJT4lIHNlbGVjdCgtY29zdG9fYm9lKSkgJT4lIA0KICBnZ3Bsb3QoIGFlcyhhbmlvLCBjb3N0b19tbWJ0dSwgY29sb3IgPSBhdXRvcikpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlPSAiQ29zdG9zIGRlIHByb2R1Y2Npw7NuIGhpZHJvY2FyYnVyw61mZXJvIGVuIEFyZ2VudGluYSB5IEJvbGl2aWEiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJDb21wYXJhY2lvbiBwcm9waWEgKENDTk4pIHZlcnN1cyBFTSAoWVBGQikiLA0KICAgICAgIHkgPSAiVVNEL01NQlRVIiwgeCA9IkHDsW8iKSsNCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobmFtZT0gIlBhw61zIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSMrDQoNCndyaXRleGw6OndyaXRlX3hsc3goY29zdG9zLCBwYXRoID0gIi9BcmNoaXZvcy9yZXBvcy9oaWRyb2NhcmJ1cm9zL2FuYWxpc2lzL3Jlc3VsdGFkb3MvYXJnZW50aW5hL2Nvc3Rvcy54bHN4IikNCg0KYGBgDQoNCg0K